// 基于下面提供的代码，完成后续练习

class Container{
    static of(value){
        return new Container(value)
    }
    constructor(value){
        this._value = value
    }
    map(fn){
        return Container.of(fn(this._value))
    }
}

class Maybe{
    static of(x){
        return new Maybe(x)
    }
    isNothing(){
        return this._value === null || this._value === undefined
    }
    constructor(value){
        this._value = value
    }
    map(fn){
        return this.isNothing()?this:Maybe.of(fn(this._value))
    }
}

const fp = require('lodash/fp')

// 练习一：使用fp.add(x,y)和fp.map(f,x)创建一个能让functor里的值增加的函数ex1

let maybe = Maybe.of([5,6,1])

let ex1 = (arr)=>{
    return fp.map(function(item){
        return fp.add(item,1)
    },arr)
}

console.log(maybe.map(ex1))

// 练习二：实现一个函数ex2，能够使用fp.first获取列表的第一个元素

let xs = Container.of(['do','ray','me','fa','so','la','ti','do'])

let ex2 = (arr)=>{
    return fp.first(arr)
}

console.log(xs.map(ex2))

// 练习三：实现一个函数ex3，使用safeProp和fp.first找到user的名字的首字母

let safeProp = fp.curry(function(x,o){
    return Maybe.of(o[x])
})

let user = {id:2,name:'Albert'}

let ex3 =(user)=> {
    return safeProp('name')(user).map(fp.first)._value
}

console.log(ex3(user))


// 练习四：使用Maybe重写ex4，不要有if语句

// 原 ex4:

// let ex4 = function(n){
//     if(n){
//         return parseInt(n)
//     }
// }

// 重写ex4:

let ex4 = Maybe.of(n).map(parseInt)